"""
StatsService 示例实现
展示如何从数据库获取行业分布和薪资段分布数据

注意：这个文件是示例，实际使用时需要：
1. 将文件重命名为 stats_service.py
2. 放在 Django 项目的 services/ 目录下
3. 确保 models.py 中的 CCompany 和 Job 模型已正确导入
"""

from django.db.models import Count, Q
from datetime import datetime, timedelta
from models import CCompany, Job


class StatsService:
    """数据统计服务"""
    
    @staticmethod
    def get_period_display(period):
        """获取周期显示名称"""
        period_map = {1: "日统计", 2: "周统计", 3: "月统计"}
        return period_map.get(period, "未知")
    
    @staticmethod
    def get_date_range(period, stats_date):
        """
        根据统计周期和日期，获取统计的时间范围
        返回: (start_date, end_date)
        """
        if period == 1:  # 日统计
            start_date = stats_date
            end_date = stats_date
        elif period == 2:  # 周统计（stats_date是周日）
            start_date = stats_date - timedelta(days=6)  # 周一到周日
            end_date = stats_date
        else:  # 月统计（stats_date是月末）
            # 获取该月的第一天
            first_day = stats_date.replace(day=1)
            start_date = first_day
            end_date = stats_date
        
        # 转换为datetime，包含时间部分
        start_datetime = datetime.combine(start_date, datetime.min.time())
        end_datetime = datetime.combine(end_date, datetime.max.time())
        
        return start_datetime, end_datetime
    
    @staticmethod
    def get_industry_distribution(start_datetime, end_datetime):
        """
        获取行业分布数据
        返回格式: {'互联网': 10, '金融': 5, '教育': 3, ...}
        """
        # 查询在时间范围内更新的企业（CCompany只有updated_at字段）
        # 如果需要在创建时统计，需要添加created_at字段
        companies = CCompany.objects.filter(
            updated_at__gte=start_datetime,
            updated_at__lte=end_datetime
        )
        
        # 按行业分组统计
        industry_stats = companies.values('industry').annotate(count=Count('id'))
        
        # 行业代码到中文名称的映射
        industry_map = {
            'internet': '互联网',
            'finance': '金融',
            'education': '教育',
            'healthcare': '医疗',
            'manufacturing': '制造业',
            'real_estate': '房地产',
            'other': '其他',
        }
        
        # 转换为字典格式
        result = {}
        for item in industry_stats:
            industry_code = item['industry']
            industry_name = industry_map.get(industry_code, industry_code)
            result[industry_name] = item['count']
        
        return result
    
    @staticmethod
    def get_salary_range_distribution(start_datetime, end_datetime):
        """
        获取薪资段分布数据
        返回格式: {'3k以下': 5, '3-5k': 10, '5-10k': 15, ...}
        """
        # 查询在时间范围内创建的职位
        jobs = Job.objects.filter(
            created_at__gte=start_datetime,
            created_at__lte=end_datetime
        )
        
        # 按薪资段分组统计
        salary_stats = jobs.values('salary_range').annotate(count=Count('id'))
        
        # 转换为字典格式
        result = {}
        for item in salary_stats:
            salary_range = item['salary_range']
            result[salary_range] = item['count']
        
        return result
    
    @staticmethod
    def run_stats(period, stats_date):
        """
        执行统计数据生成
        period: 1=日统计, 2=周统计, 3=月统计
        stats_date: 统计日期（date对象）
        """
        from datastats.models import DataStats
        
        # 获取时间范围
        start_datetime, end_datetime = StatsService.get_date_range(period, stats_date)
        
        # 获取行业分布
        industry_distribution = StatsService.get_industry_distribution(
            start_datetime, end_datetime
        )
        
        # 获取薪资段分布
        salary_distribution = StatsService.get_salary_range_distribution(
            start_datetime, end_datetime
        )
        
        # 计算其他业务指标
        total_companies = sum(industry_distribution.values())
        total_jobs = sum(salary_distribution.values())
        
        # 构建业务指标数据
        business_data = {
            "行业分布": industry_distribution,
            "薪资段分布": salary_distribution,
            "新增企业数": total_companies,
            "新增职位数": total_jobs,
            # 可以添加更多业务指标
        }
        
        # 保存或更新统计数据
        # 注意：这里只保存业务指标，合规指标和互动指标需要单独实现
        stats_obj, created = DataStats.objects.update_or_create(
            period=period,
            stats_type=1,  # 业务指标
            stats_date=stats_date,
            defaults={
                'business_data': business_data,
            }
        )
        
        return stats_obj


# 使用示例：
# from services.stats_service import StatsService
# from datetime import date
# 
# # 执行日统计
# today = date.today()
# StatsService.run_stats(period=1, stats_date=today)
# 
# # 执行周统计（本周日）
# from datetime import datetime
# today = datetime.now().date()
# sunday = today - timedelta(days=today.weekday() + 1)
# StatsService.run_stats(period=2, stats_date=sunday)
# 
# # 执行月统计（上月末）
# from datetime import datetime
# today = datetime.now().date()
# last_month_end = (today.replace(day=1) - timedelta(days=1))
# StatsService.run_stats(period=3, stats_date=last_month_end)

